package com.zijidelu.luframework.utils.collection.stream;

import java.util.Collection;
import java.util.stream.Stream;

/**
 * 通用 Stream 工具类
 * 自动判断使用顺序流或并行流，避免不必要的并行开销。
 *
 * @author ZIJIDELU
 * @datetime 2025/10/28
 */
public final class StreamUtil {

    /**
     * 默认启用并行流的最小集合大小
     */
    private static final int DEFAULT_PARALLEL_THRESHOLD = 10000;

    private StreamUtil() {
        throw new AssertionError("StreamUtil cannot be instantiated");
    }

    /**
     * 根据集合大小自动选择顺序流或并行流。
     *
     * @param collection 数据集合
     * @param <T>        元素类型
     * @return Stream 实例（顺序流或并行流）
     */
    public static <T> Stream<T> smartStream(Collection<T> collection) {
        return smartStream(collection, DEFAULT_PARALLEL_THRESHOLD);
    }

    /**
     * 根据集合大小和自定义阈值自动选择流类型。
     *
     * @param collection        数据集合
     * @param parallelThreshold 使用并行流的最小元素数量
     * @param <T>               元素类型
     * @return Stream 实例
     */
    public static <T> Stream<T> smartStream(Collection<T> collection, int parallelThreshold) {
        if (collection == null || collection.isEmpty()) {
            return Stream.empty();
        }

        // 当集合较大且系统支持多核并行时，使用并行流
        if (collection.size() > parallelThreshold && Runtime.getRuntime().availableProcessors() > 1) {
            return collection.parallelStream();
        } else {
            return collection.stream();
        }
    }

}
